Skip to content

refactor(chat): migrate to scoped web components - #6933

Draft
RSS1102 wants to merge 16 commits into
developfrom
rss1102/migrate-shared-chat-types
Draft

refactor(chat): migrate to scoped web components#6933
RSS1102 wants to merge 16 commits into
developfrom
rss1102/migrate-shared-chat-types

Conversation

@RSS1102

@RSS1102 RSS1102 commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator

🤔 这个 PR 的性质是?

  • 日常 bug 修复
  • 新特性提交
  • 文档改进
  • 演示代码改进
  • 组件样式/交互改进
  • CI/CD 改进
  • 重构
  • 代码风格优化
  • 测试用例
  • 分支合并
  • 其他

🧪 A/B 测试

两组 StackBlitz 使用相同的 Vue 源码和 AGUI 事件,只切换 @tdesign-vue-next/chat

两边都只声明 @tdesign-vue-next/chat,没有额外安装或别名覆盖 Web Components。测试通过 useChat 创建 ChatEngine,再显式放入 Vue 深层 ref,连续发送两个 THINKING_TEXT_MESSAGE_CONTENT

场景 isReactive(engine) 结果
@tdesign-vue-next/chat@0.6.0 true 第二个 CONTENT 触发 Proxy invariant TypeError,思考过程渲染中断
Vue Chat 预览包 a52eb9e true 状态 complete,思考文本为 第一段第二段no error

🔗 相关 PR

💡 需要修复的问题

AGUI 思考过程流式输出中断

@tdesign-vue-next/chat@0.6.0 使用旧的 tdesign-web-components 单包。旧实现会让 mapper 持有的 reasoning 数据与 Immer message store 共享对象。第一个 CONTENT 写入 store 后对象被冻结,第二个 CONTENT 再通过 Vue 深层 Proxy 读取时违反 Proxy invariant,最终抛出 TypeError

Vue Chat 仍依赖旧 WebC 物理路径

运行时和类型通过 tdesign-web-components/lib/... 导入,无法直接消费分包后的公共 API,也与旧目录结构强耦合。

上传附件缺少稳定的状态边界

公开 Chatbot.sendUserMessage() 接收的附件可能包含 Vue Proxy、File 和上传响应等业务对象。原对象直接进入 ChatEngine 状态后,可能被 Immer 冻结,并把上传过程字段带入内部消息状态。

✅ 修复情况

当前 PR 主要修复什么

本 PR 负责 Vue Chat 对 scoped WebC 的迁移和接入:

  1. 将旧 tdesign-web-components 依赖替换为 @tdesign/web-components@tdesign/web-components-chat
  2. 将运行时、样式和类型导入迁移到 scoped 包的公开入口,不再访问 lib/... 物理路径;
  3. 从 Vue Chat 聚合入口显式转发 ChatEngine、Chatbot、ChatMessage、ChatSender 等公共类型;
  4. 删除 Vue 侧重复的 UploadActionType,统一复用 WebC Chat Sender 类型;
  5. 保持 useChat 的深层 ref 行为,用 A/B 验证确认修复来自新的 ChatEngine 数据流,而不是通过 shallowRef 绕开问题。

分包后的 ChatEngine 不再在后续事件中读取已被 Immer 冻结的共享 reasoning 数组。每个 CONTENT 使用独立 delta,并在 message store 内完成合并,因此连续思考事件不会再触发原异常链路。

TDesignOteam/tdesign-web-components#418 的作用和必要性

TDesignOteam/tdesign-web-components#418 修复公开 Chatbot.sendUserMessage() 的附件 DTO 边界:进入 ChatEngine 前创建新的附件数组和 item,只保留协议字段,不把 rawresponse 等上传过程对象写入内部状态,同时保持 metadata 的既有语义。

目标 负责的改动 TDesignOteam/tdesign-web-components#418 是否必要
修复 AGUI THINKING 中断 Vue Chat 迁移到分包后的 ChatEngine
修复公开发送入口的上传附件边界 TDesignOteam/tdesign-web-components#418
在 Vue Chat 中同时验证两项修复 本 PR 使用 TDesignOteam/tdesign-web-components#418a6899156 不可变预览

因此,TDesignOteam/tdesign-web-components#418 不是 THINKING 修复的前置条件,也不修改 AGUI reasoning;本 PR 使用 a6899156 不可变预览,是为了跟随该 PR 最新实现并同时覆盖用户需要的上传附件修复。

当前状态

  • THINKING 流式中断:已修复,并通过上方深层 ref A/B 验证;
  • scoped 包迁移及公共类型出口:已完成;
  • 上传附件边界:已接入 TDesignOteam/tdesign-web-components#418 当前实现;
  • 正式依赖:待 WebC 合并发布后替换临时预览版本,因此本 PR 继续保持 Draft。

验证

  • pnpm install --frozen-lockfile
  • pnpm run build:chat
  • pnpm -C packages/tdesign-vue-next-chat/site build
  • git diff --check
  • Vue 深层 ref + 连续 THINKING CONTENT 的 A/B 浏览器验证

📝 更新日志

  • 本条 PR 不需要纳入 Changelog

tdesign-vue-next

无变更。

@tdesign-vue-next/chat

  • fix(chat): 修复 Vue 响应式代理下 AGUI 思考过程流式输出中断的问题

@tdesign-vue-next/nuxt

无变更。

@tdesign-vue-next/auto-import-resolver

无变更。

☑️ 请求合并前的自查清单

  • 文档已补充或无须补充
  • 代码演示已提供或无须提供
  • TypeScript 定义已补充或无须补充
  • Changelog 已提供或无须提供

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 21.4 kB

ℹ️ View Unchanged
Filename Size
packages/auto-import-resolver/dist/index.cjs 10.7 kB
packages/auto-import-resolver/dist/index.js 10.7 kB

compressed-size-action::auto-import-resolver

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 3.55 kB

ℹ️ View Unchanged
Filename Size
packages/tdesign-vue-next-nuxt/dist/module.d.mts 551 B
packages/tdesign-vue-next-nuxt/dist/module.mjs 2.84 kB
packages/tdesign-vue-next-nuxt/dist/types.d.mts 164 B

compressed-size-action::tdesign-vue-next-nuxt

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Size Change: -65 B (-0.09%)

Total Size: 74.8 kB

📦 View Changed
Filename Size Change
packages/tdesign-vue-next-chat/es/_chunks/dep-29093412.mjs 2.16 kB +2.16 kB (new file) 🆕
packages/tdesign-vue-next-chat/es/_chunks/dep-f8739a7c.mjs 0 B -2.16 kB (removed) 🏆
packages/tdesign-vue-next-chat/es/chat-content/chat-content.mjs 2.22 kB -7 B (-0.31%)
packages/tdesign-vue-next-chat/es/chat-content/index.mjs 377 B -7 B (-1.82%)
packages/tdesign-vue-next-chat/es/chat-engine/components/provider/agent-state.mjs 521 B +1 B (+0.19%)
packages/tdesign-vue-next-chat/es/chat-engine/components/toolcall/hoc.mjs 755 B +1 B (+0.13%)
packages/tdesign-vue-next-chat/es/chat-engine/components/toolcall/index.mjs 442 B +1 B (+0.23%)
packages/tdesign-vue-next-chat/es/chat-engine/components/toolcall/render.mjs 341 B +2 B (+0.59%)
packages/tdesign-vue-next-chat/es/chat-engine/hooks/index.mjs 346 B +1 B (+0.29%)
packages/tdesign-vue-next-chat/es/chat-engine/hooks/useChat.mjs 682 B -3 B (-0.44%)
packages/tdesign-vue-next-chat/es/chat-item/chat-item.mjs 1.98 kB -4 B (-0.2%)
packages/tdesign-vue-next-chat/es/chat-item/index.mjs 428 B -3 B (-0.7%)
packages/tdesign-vue-next-chat/es/chat-list/chat-list.mjs 2.78 kB +1 B (+0.04%)
packages/tdesign-vue-next-chat/es/chat-list/index.mjs 367 B +2 B (+0.55%)
packages/tdesign-vue-next-chat/es/chat-markdown/index.mjs 252 B -8 B (-3.08%)
packages/tdesign-vue-next-chat/es/chat-message/index.mjs 317 B -1 B (-0.31%)
packages/tdesign-vue-next-chat/es/chat-sender/chat-sender.mjs 3.29 kB +1 B (+0.03%)
packages/tdesign-vue-next-chat/es/chat-sender/index.mjs 358 B +2 B (+0.56%)
packages/tdesign-vue-next-chat/es/chat-thinking/chat-thinking.mjs 934 B -7 B (-0.74%)
packages/tdesign-vue-next-chat/es/chat-thinking/index.mjs 321 B -12 B (-3.6%)
packages/tdesign-vue-next-chat/es/chatbot/index.mjs 403 B +6 B (+1.51%)
packages/tdesign-vue-next-chat/es/index.mjs 1.48 kB -33 B (-2.19%)
ℹ️ View Unchanged
Filename Size
packages/tdesign-vue-next-chat/es/_chunks/dep-baff1c25.mjs 30.4 kB
packages/tdesign-vue-next-chat/es/attachments/index.mjs 240 B
packages/tdesign-vue-next-chat/es/chat-actionbar/chat-actionbar-props.mjs 364 B
packages/tdesign-vue-next-chat/es/chat-actionbar/chat-actionbar.mjs 1.57 kB
packages/tdesign-vue-next-chat/es/chat-actionbar/index.mjs 335 B
packages/tdesign-vue-next-chat/es/chat-content/chat-content-props.mjs 357 B
packages/tdesign-vue-next-chat/es/chat-engine/components/activity/index.mjs 321 B
packages/tdesign-vue-next-chat/es/chat-engine/components/activity/registry.mjs 406 B
packages/tdesign-vue-next-chat/es/chat-engine/components/activity/render.mjs 783 B
packages/tdesign-vue-next-chat/es/chat-engine/components/provider/index.mjs 219 B
packages/tdesign-vue-next-chat/es/chat-engine/components/shared/ComponentErrorBoundary.mjs 549 B
packages/tdesign-vue-next-chat/es/chat-engine/components/shared/createRegistry.mjs 978 B
packages/tdesign-vue-next-chat/es/chat-engine/components/shared/index.mjs 258 B
packages/tdesign-vue-next-chat/es/chat-engine/components/shared/useRegistrationListener.mjs 624 B
packages/tdesign-vue-next-chat/es/chat-engine/components/toolcall/registry.mjs 409 B
packages/tdesign-vue-next-chat/es/chat-engine/hooks/useAgentActivity.mjs 954 B
packages/tdesign-vue-next-chat/es/chat-engine/hooks/useAgentState.mjs 1.22 kB
packages/tdesign-vue-next-chat/es/chat-engine/hooks/useAgentToolcall.mjs 920 B
packages/tdesign-vue-next-chat/es/chat-engine/index.mjs 561 B
packages/tdesign-vue-next-chat/es/chat-input/chat-input-props.mjs 352 B
packages/tdesign-vue-next-chat/es/chat-input/chat-input.mjs 1.53 kB
packages/tdesign-vue-next-chat/es/chat-input/index.mjs 320 B
packages/tdesign-vue-next-chat/es/chat-item/chat-item-props.mjs 432 B
packages/tdesign-vue-next-chat/es/chat-list/props.mjs 453 B
packages/tdesign-vue-next-chat/es/chat-loading/chat-loading-props.mjs 281 B
packages/tdesign-vue-next-chat/es/chat-loading/index.mjs 244 B
packages/tdesign-vue-next-chat/es/chat-message/chat-message-props.mjs 435 B
packages/tdesign-vue-next-chat/es/chat-message/chat-message.mjs 1.25 kB
packages/tdesign-vue-next-chat/es/chat-reasoning/chat-reasoning-props.mjs 421 B
packages/tdesign-vue-next-chat/es/chat-reasoning/chat-reasoning.mjs 1.19 kB
packages/tdesign-vue-next-chat/es/chat-reasoning/index.mjs 300 B
packages/tdesign-vue-next-chat/es/chat-sender/chat-sender-props.mjs 366 B
packages/tdesign-vue-next-chat/es/chat-thinking/chat-thinking-props.mjs 383 B
packages/tdesign-vue-next-chat/es/config-provider.mjs 158 B
packages/tdesign-vue-next-chat/es/style/css.mjs 42 B
packages/tdesign-vue-next-chat/es/style/index.css 3.97 kB
packages/tdesign-vue-next-chat/es/utils/index.mjs 493 B

compressed-size-action::tdesign-vue-next-chat

@pkg-pr-new

pkg-pr-new Bot commented Aug 20, 2026

Copy link
Copy Markdown
  • tdesign-vue-next-demo

    npm i https://pkg.pr.new/@tdesign-vue-next/auto-import-resolver@6933
    
    npm i https://pkg.pr.new/tdesign-vue-next@6933
    
    npm i https://pkg.pr.new/@tdesign-vue-next/chat@6933
    
    npm i https://pkg.pr.new/@tdesign-vue-next/nuxt@6933
    

commit: 239f9e5

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 960 kB

ℹ️ View Unchanged
Filename Size
packages/tdesign-vue-next/dist/plugin.css 3.02 kB
packages/tdesign-vue-next/dist/reset.css 1.91 kB
packages/tdesign-vue-next/dist/tdesign.css 55.5 kB
packages/tdesign-vue-next/dist/tdesign.js 533 kB
packages/tdesign-vue-next/dist/tdesign.min.css 50.4 kB
packages/tdesign-vue-next/dist/tdesign.min.js 317 kB

compressed-size-action::tdesign-vue-next

@tdesign-bot

tdesign-bot commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator

TDesign Component Site Preview Open

Component Preview
tdesign-vue-next 完成
@tdesign-vue-next/chat 完成

@RSS1102
RSS1102 marked this pull request as ready for review August 25, 2026 10:18
@RSS1102
RSS1102 marked this pull request as draft August 25, 2026 10:18
@RSS1102
RSS1102 marked this pull request as ready for review August 25, 2026 10:21
@RSS1102
RSS1102 marked this pull request as draft August 25, 2026 10:25
@RSS1102
RSS1102 marked this pull request as ready for review August 26, 2026 02:49
@RSS1102
RSS1102 marked this pull request as draft August 26, 2026 03:02
@RSS1102 RSS1102 closed this Aug 26, 2026
@RSS1102 RSS1102 reopened this Aug 26, 2026
@RSS1102
RSS1102 marked this pull request as ready for review August 26, 2026 04:23
@RSS1102
RSS1102 marked this pull request as draft August 26, 2026 07:08
@RSS1102 RSS1102 closed this Aug 26, 2026
@RSS1102 RSS1102 reopened this Aug 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants